package com.woniu.aimd.service.impl;

import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.lang.UUID;
import com.woniu.aimd.mapper.ClassMapper;
import com.woniu.aimd.mapper.UserMapper;
import com.woniu.aimd.pojo.DTO.UserDTO;
import com.woniu.aimd.pojo.VO.UserTokenVO;
import com.woniu.aimd.pojo.entity.User;

import com.woniu.aimd.service.UserService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author zcnovice
 * @data 2025/6/10 上午11:50
 */
@Service
public class UserServiceImpl implements UserService {


    @Autowired
    private UserMapper userMapper;
    @Autowired
    private ClassMapper classMapper;
    @Autowired
    private RedisTemplate<String,String> redisTemplate;
    @Override
    public boolean insert(UserDTO user) {
       // 老师
        if (user.getRole() == 0) {
             return     userMapper.insert(user);
        }
        // 学生
        String classId = redisTemplate.opsForValue().get("majorCurrentClass::" + user.getMajor());
        if (classId==null) {
            classId =  classMapper.getCurrentClassIdByMajor(user.getMajor());
            redisTemplate.opsForValue().set("majorCurrentClass::" + user.getMajor(), classId);
            System.out.println(classId);
        }

        userMapper.insert(user);
        // 插入班级逻辑


        return  userMapper.insertStudentClass(user.getId(),Integer.parseInt(classId),UUID.randomUUID().toString());
    }


    @Override
    public boolean delete(String userId) {
        return userMapper.delete(userId);
    }

    @Override
    public boolean update(User user) {
        return userMapper.update(user);
    }

    @Override
    public List<User> findByUser(User user) {
        return userMapper.findByUser(user);
    }

    @Override
    public UserTokenVO login(User user, String satoken) {
        //先判断用户是否已经登陆过
        if (satoken == null || satoken.equals("")) {
            if (user.getAccount() != null && user.getPassword() != null) {
                UserTokenVO userTokenVO = new UserTokenVO();
                if (userMapper.login(user) == null) {
                    userTokenVO.setResult("帐号/密码错误！");
                    return userTokenVO;
                } else {
                    User currentUser = userMapper.login(user);

                    //打印satoken
                    System.out.println("token--->" + StpUtil.getTokenInfo());
                    userTokenVO.setResult("登陆成功");
                    // 先执行登录，再设置会话属性
                    StpUtil.login(currentUser.getId());
                    // 获取Token信息
                    SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
                    // 将用户信息存入会话
                    StpUtil.getSession().set("user", currentUser);
                    // 强制加载权限列表（确保权限生效）
                    StpUtil.getPermissionList();
                    // 输出调试信息
                    System.out.println("生成的Token: " + tokenInfo.getTokenValue());
                    System.out.println("权限列表: " + StpUtil.getPermissionList());
                    System.out.println("当前用户角色: " + currentUser.getRole());
                    System.out.println("ai权限检查: " + StpUtil.hasPermission("ai"));
                    System.out.println(StpUtil.getPermissionList());
                    System.out.println("11判断当前用户是否含有ai对话权限：" + StpUtil.hasPermission("ai"));
                    //把当前用户里的同名字段 全部赋值给userVo
                    BeanUtils.copyProperties(currentUser,userTokenVO);
                    userTokenVO.setToken(StpUtil.getTokenInfo().getTokenValue());
                    return userTokenVO;
                }
            }
        } else {
            if (satoken == String.valueOf(StpUtil.getTokenInfo())) {
                UserTokenVO olduserTokenVO = new UserTokenVO();
                //从对话中拿到已登录用户信息
                User oldtUser = (User) StpUtil.getSession().get("user");
                //从全部赋值到这个userTokenVO对象里对应字段上
                BeanUtils.copyProperties(olduserTokenVO, oldtUser);
                return olduserTokenVO;
            }else {
                UserTokenVO userTokenVO = new UserTokenVO();
                User currentUser = userMapper.login(user);
                if (currentUser == null) {
                    return new UserTokenVO();
                } else {
                    //打印satoken
                    System.out.println("token--->" + StpUtil.getTokenInfo());
                    userTokenVO.setResult("登陆成功");
                    // 先执行登录，再设置会话属性
                    StpUtil.login(currentUser.getId());
                    // 获取Token信息
                    SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
                    // 将用户信息存入会话
                    StpUtil.getSession().set("user", currentUser);
                    // 强制加载权限列表（确保权限生效）
                    StpUtil.getPermissionList();
                    //把当前用户里的同名字段 全部赋值给userVo
                    BeanUtils.copyProperties(currentUser, userTokenVO);
                    userTokenVO.setToken(StpUtil.getTokenInfo().getTokenValue());
                    return userTokenVO;
                }
            }
        }
        return new UserTokenVO();
    }
}
